package jp.co.menox.controller.tmserver.user;

import java.util.Map;

import jp.co.menox.controller.tmserver.TmServerControllerBase;
import jp.co.menox.tmcommon.common.DataConst;
import jp.co.menox.tmcommon.meta.UserMeta;
import jp.co.menox.tmcommon.model.User;

import org.slim3.controller.Navigation;
import org.slim3.controller.validator.AbstractValidator;
import org.slim3.controller.validator.RequiredValidator;
import org.slim3.controller.validator.Validators;
import org.slim3.util.ApplicationMessage;
import org.slim3.util.BeanUtil;
import org.slim3.util.CopyOptions;

/**
 * ユーザ登録画面
 * @author
 *
 */
public class RequestRegisterUserController extends TmServerControllerBase {

    @Override
    protected Navigation setUp() {
        // 基底クラスの処理を無効化
        return null;
    }

    @Override
    public Navigation run() throws Exception {
        if (!isPost() || !isValid()) {
            // 都道府県マップ（コンボ選択用）
            Map<String, String> cityCodeMap = DataConst.getCityCodeMap();
            requestScope("cityCodeMap", cityCodeMap);
            return forward("registerUser.jsp");
        }

        // 登録用model
        User model = new User();
        // 入力値を設定
        UserMeta m = UserMeta.get();
        BeanUtil.copy(request, model, 
            (new CopyOptions()).dateConverter("yyyy/MM/dd", m.birthday.getName()));

        userService.insert(model);
        
        // 登録ＯＫ：　⇒認証ＯＫ

        // セッション開始
        sessionScope("UserId", model.getId());

//        // channel用設定
//        setChannel();
      
        // 登録完了：メニュー画面へ
        return forward("/tmserver/gate/menu.jsp");
    }
    
    /**
     * 入力値のvalidation
     * @return
     */
    private boolean isValid() {
        Validators v = new Validators(request);
        v.add("loginId", v.required(), v.minlength(4), v.maxlength(64), new KnownUserValidator("そのＩＤはすでに使用されています。"));
        v.add("password", v.required(), v.minlength(4), v.maxlength(512));
        v.add("name", v.required(), v.minlength(1), v.maxlength(32));
        v.add("mail", v.required(), v.minlength(5), v.maxlength(512));
        v.add("zipCode", v.required(), v.integerType(), v.minlength(7), v.maxlength(7));
        v.add("city", v.required(), v.minlength(3), v.maxlength(512));
        v.add("address", v.required(), v.minlength(1), v.maxlength(512));
        v.add("building", v.maxlength(512));
        v.add("birthday", v.required(), v.dateType("yyyy/MM/dd"));

//        loginId             String      64  
//        password                String      512 
//        name                String      32  
//        mail                String      512 
//        zipCode             String      16  
//        city                String      512 
//        address             String      512 
//        building                String      512 
//        birthday                java.util.Date      -   

        return v.validate();
    }

    /**
     * すでに登録済みのユーザであるかを確認するValidator<br />
     * TODOF: 表示メッセージを指定しないとエラーになる（はず）
     * @author
     *
     */
    private class KnownUserValidator extends AbstractValidator {
        public KnownUserValidator() {
            super();
        }
        public KnownUserValidator(String message) {
            super(message);
        }

        @Override
        public String validate(Map<String, Object> parameters, String name) {
            Object value = parameters.get(name);

            String loginId = (String)value;
            User existModel = userService.getUserModel(loginId);
            if (existModel != null) {
                if (message != null) {
                    return message;
                }
                return ApplicationMessage.get(getMessageKey(), getLabel(name));
            }
            return null;
        }

        @Override
        protected String getMessageKey() {
            return null;
        }
    }
}
